package cn.biplam.common.client;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Map;

import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.common.wrapper.KvMap;

/**
 * 数据操作类的数据过滤器
 * @author XiaoRuxing 2009-6-2下午04:41:48
 * @version 1.0
 */
public class DataFilter implements Serializable{
	
	private static final long serialVersionUID = -684856548944230845L;
	
	private KvMap<String, String> filter;
	/** 外部传来的执行sql*/
	private ArrayList<String> sqls;
	/** 是否getsql*/
	private boolean ifGetSql;
	
	/** 唯一ID名称 */
	private final String keyWord="id";
	/** 过滤器主键ID<BR>
	 * 用于:过滤器作为数据查询条件数据集的分页 
	 * */
	private String keyValue;
	
	public DataFilter(){
		filter=new KvMap<String, String>();
	}
	
	/**
	 * 构造方法 传入ID的值初始化，适用于仅需要一个参数的Filter
	 * @param id
	 * @throws ErrorMessage
	 */
	public DataFilter(String id) throws ErrorMessage{
		this();
		this.put(keyWord, id);
	}
	
	/**
	 * 构造方法 传入一个参数名称和值初始化
	 * @param key	参数名称
	 * @param value	参数值
	 * @throws ErrorMessage
	 */
	public DataFilter(String key,String value) throws ErrorMessage{
		this();
		this.put(key, value);
	}
	/**
	 * 获取过滤器唯一ID，根据过滤器内容生成
	 * @return 过滤器唯一ID
	 */
	public String getFilterId(){
		String keyHash="";
		String valueHash="";
		for(Map.Entry<String, String> entry:filter){
			keyHash=keyHash+entry.getKey();
			valueHash=valueHash+entry.getValue();
		}
		return String.valueOf((keyHash+valueHash).hashCode());
	}
	
	/**
	 *  放入默认参数值
	 * @param value 值
	 * @throws ErrorMessage 
	 */
	public void put(String value) throws ErrorMessage{
		this.put(keyWord, value);
	}
	
	/**
	 * 插入一个条件到过滤器，条件名唯一
	 * @param key   条件名称
	 * @param value 条件值
	 * @throws ErrorMessage 
	 */
	public void put(String key,String value) throws ErrorMessage{
		if(key==null){
			throw new ErrorMessage("key is null exception");
		}
		this.filter.put(key.toUpperCase(), value);
	}
	
	/**
	 * 插入一个条件到过滤器，条件名唯一
	 * @param key   条件名称
	 * @param value 条件值
	 * @throws ErrorMessage 
	 */
	public void put(Object key,Object value) throws ErrorMessage{
		if(key==null){
			throw new ErrorMessage("key is null exception");
		}
		if(value!=null){
			this.filter.put(String.valueOf(key).toUpperCase(),
					String.valueOf(value));
		}else{
			this.filter.put(String.valueOf(key).toUpperCase(),
					null);
		}
	}
	
	/**
	 * 插入多个条件到过滤器
	 * @param values 条件容器
	 * @throws ErrorMessage
	 */
	public void putAll(KvMap<String, String> values) throws ErrorMessage{
		for(Map.Entry<String, String> value:values){
			this.filter.put(value.getKey().toUpperCase(),
					value.getValue());
		}
	}
	
	/**
	 * 将一个过滤器的所有条件放入当前过滤器
	 * @param filter 过滤器 
	 * @throws ErrorMessage
	 */
	public void putAll(DataFilter filter) throws ErrorMessage{
		this.putAll(filter.getFilter());
	}
	
	/**
	 * 将一个过滤器的除指定键外的所有条件放入当前过滤器
	 * @param filter 过滤器 
	 * @param excludeKey 
	 * @throws ErrorMessage
	 */
	public void putAll(DataFilter filter,String excludeKey) throws ErrorMessage{
		this.putAll(filter.getFilter(),excludeKey);
	}
	
	/**
	 *  将一个过滤器的除指定键外的所有条件放入当前过滤器
	 * @param values 条件容器
	 * @throws ErrorMessage
	 */
	public void putAll(KvMap<String, String> values,String excludeKey) throws ErrorMessage{
		if(excludeKey!=null){
			excludeKey = excludeKey.toUpperCase();
		}
		for(Map.Entry<String, String> value:values){
			String key = value.getKey().toUpperCase();
			if(!key.equals(excludeKey)){//如果当前键不等于要排除的键将当前键值对插入到目标容器
				this.filter.put(key,
						value.getValue());
			}
		}
	}
	
	/**
	 * 根据条件名获取条件值,如果不存在条件对应的值返回null
	 * @param key 条件名
	 * @return 条件名对应值
	 * @throws ErrorMessage 
	 */
	public String getValue(String key){
		if(key==null){
			return null;
		}
		return this.filter.getByKey(key.toUpperCase());
	}
	
	/**
	 * 根据条件名获取条件值,如果不存在条件对应的值返回null
	 * @param key key 条件名
	 * @return 条件名对应值
	 */
	public String getValue(Object key){
		if(key==null){
			return null;
		}
		return this.getValue(String.valueOf(key));
	}
	
	/**
	 * 返回默认的ID参数值
	 * @return
	 */
	public String getValue(){
		return this.getValue(keyWord);
	}
	
	/**
	 * 返回过滤器内容
	 * @return  过滤器内容
	 */
	public KvMap<String, String> getFilter(){
		return this.filter;
	}

	/**
	 * 取传外部传进来的sql
	 * @return
	 */
	public ArrayList<String> getSqls() {
		return sqls;
	}

	/**
	 * 设置外部sql
	 * @param sqls
	 */
	public void setSqls(ArrayList<String> sqls) {
		this.sqls = sqls;
	}

	/**
	 * 取是否返回sql
	 * @return
	 */
	public boolean isIfGetSql() {
		return ifGetSql;
	}

	/**
	 * 设置是否返回sql true:只返回sql 不执行 false:执行sql但不返回
	 * @param ifGetSql
	 */
	public void setIfGetSql(boolean ifGetSql) {
		this.ifGetSql = ifGetSql;
	}
	
	/**
	 *  设置当前过滤器主键<BR>用于:过滤器作为数据查询条件数据集的分页 
	 * @param key   条件名称
	 * @param value 条件值
	 * @throws ErrorMessage 
	 */
	public void setFilterKey(String key,String value) throws ErrorMessage{
		this.put(key, value);
		this.keyValue = value;
	}
	
	/**
	 *  获取当前过滤器的唯一标示ID
	 */
	public String getKeyCode(){
		int hashCode = 0;
		//如果设置了当前过滤器的主键,返回主键的Hash代码
		if(this.keyValue!=null){
			hashCode = this.keyValue.hashCode();
		}else{//返回过滤器所有项的Hash码
			for(Map.Entry<String, String> key: this.filter){
				hashCode = hashCode+key.getValue().hashCode();
			}
		}
		return String.valueOf(hashCode);
	}
	
	public String toString(){
		return this.getFilter().toString();
	}
}
